package m_adxplan

import (
	"gopkg.in/mgo.v2"
	"gopkg.in/mgo.v2/bson"
	"time"
	"wx-api/adx-bid/common"
	"wx-api/adx-bid/config"
)

type AdxPlan struct {
	Id         bson.ObjectId `bson:"_id" json:"id,omitempty"`
	Uqid       string        `bson:"-" json:"uqid,omitempty"`
	Code       string        `bson:"code" json:"code,omitempty"`               //唯一id
	Name       string        `bson:"name" json:"name,omitempty"`               //名称
	AdxItems   []ItemList    `bson:"adx_items" json:"adx_items,omitempty"`     //adx流量集合
	SspItems   []ItemList    `bson:"ssp_items" json:"ssp_items,omitempty"`     //ssp流量集合
	Dealid     string        `bson:"dealid" json:"dealid,omitempty"`           //交易ID
	DspItems   []ItemList    `bson:"dsp_items" json:"dsp_items,omitempty"`     //预算集合
	Flag       int           `bson:"flag" json:"flag,omitempty"`               //1 开启 2 关闭
	Status     int           `bson:"status" json:"status,omitempty"`           //1 正常 2 删除
	CreateTime int64         `bson:"create_time" json:"create_time,omitempty"` //创建时间
	UpdateTime int64         `bson:"update_time" json:"update_time,omitempty"` //更新时间
	Version    string        `bson:"version" json:"version,omitempty"`         //版本号
}

type ItemList struct {
	Ty      string `bson:"ty" json:"ty,omitempty"`             //类型：1，ssp，2，adx,3,dsp
	AId     string `bson:"aid" json:"aid,omitempty"`           //所属id
	AName   string `bson:"a_name" json:"a_name,omitempty"`     //所属名称
	MId     string `bson:"mid" json:"mid,omitempty"`           //所属id
	MName   string `bson:"m_name" json:"m_name,omitempty"`     //所属名称
	SId     string `bson:"sid" json:"sid,omitempty"`           //所属id
	SName   string `bson:"s_name" json:"s_name,omitempty"`     //所属名称
	AdvId   string `bson:"adv_id" json:"adv_id,omitempty"`     //第三方广告位id
	AdvName string `bson:"adv_name" json:"adv_name,omitempty"` //第三方广告位名称
	MediaId string `bson:"mediaid" json:"mediaid,omitempty"`   //第三方媒体id
	Weight  int    `bson:"weight" json:"weight"`               //权重
	Flag    bool   `bson:"flag" json:"flag"`                   //是否优先
	//自动出价
	MinPriceRate int `bson:"min_price_rate" json:"min_price_rate,omitempty"` //底价上浮比例
	RetPriceRate int `bson:"rtb_price_rate" json:"rtb_price_rate,omitempty"` //溢价率
	//固价
	RtbPrice   int `bson:"rtb_price" json:"rtb_price,omitempty"`     //发送上游价格：分
	MediaPrice int `bson:"media_price" json:"media_price,omitempty"` //返回媒体价格：分
}

func dbGet() *common.TkMongo {
	return config.MgTableAdxPlan
}

func Save(a AdxPlan) (string, error) {
	a.Id = bson.NewObjectId()
	tmptime := time.Now().Unix()
	a.CreateTime = tmptime
	a.UpdateTime = tmptime
	a.Flag = 1
	a.Status = 1
	a.Version = config.SysVersion
	err := dbGet().Insert(a)
	return a.Id.Hex(), err
}

// 更新
func Update(a AdxPlan) error {
	m := bson.M{
		"name":        a.Name,
		"adx_items":   a.AdxItems,
		"ssp_items":   a.SspItems,
		"dealid":      a.Dealid,
		"dsp_items":   a.DspItems,
		"update_time": time.Now().Unix(),
	}

	return dbGet().Set(bson.M{"_id": a.Id}, m)
}

// 更新状态
func UpdateFalg(id string, flag int) error {
	m := bson.M{
		"flag":        flag,
		"update_time": time.Now().Unix(),
	}

	return dbGet().Set(bson.M{"_id": bson.ObjectIdHex(id)}, m)
}

// 删除
func UpdateDel(id string, status int) error {
	m := bson.M{
		"status":      status,
		"update_time": time.Now().Unix(),
	}

	return dbGet().Set(bson.M{"_id": bson.ObjectIdHex(id)}, m)
}

// 获取所有
func GetAll() []AdxPlan {
	list := []AdxPlan{}
	_ = dbGet().All(nil, &list)
	return list
}

func GetWAll(a int64) []AdxPlan {
	list := []AdxPlan{}
	_ = dbGet().All(bson.M{"update_time": bson.M{"$gte": a}}, &list)
	return list
}

// 获取详情
func GetByCode(id string) (*AdxPlan, error) {
	a := &AdxPlan{}
	err := dbGet().FindOne(bson.M{"_id": bson.ObjectIdHex(id)}, a)
	if err != nil {
		if err == mgo.ErrNotFound {
			return nil, nil
		}
		return nil, err
	}
	return a, nil
}
func GetByCk(id string) (*AdxPlan, error) {
	a := &AdxPlan{}
	w := bson.M{"_id": bson.ObjectIdHex(id)}
	err := dbGet().FindOne(w, a)
	if err != nil {
		if err == mgo.ErrNotFound {
			return nil, nil
		}
		return nil, err
	}
	return a, nil
}

// 列表，带分页
func List(id, name, adx_uid string, flag, status, pageNum, pageSize int) (*common.PageInfo, error) {
	s := bson.M{}
	if id != "" {
		s["_id"] = bson.ObjectIdHex(id)
	}
	if name != "" {
		s["name"] = bson.M{"$regex": bson.RegEx{name, "i"}}
	}
	if flag > 0 {
		s["flag"] = flag
	}
	if status > 0 {
		s["status"] = status
	}
	var list []AdxPlan
	return dbGet().FindPageInfo(s, "", pageSize, pageNum, "-update_time", &list)
}
